﻿#ifndef CREATEALOTOFPASSWORDS_H
#define CREATEALOTOFPASSWORDS_H

#include <BaseChMushSte/basechickenmushroomstewed.h>

#include <map>
#include <string>
#include <vector>
#include <array>
#include <random>  // std::mt19937_64

namespace cms{

    class CreateALotOfPasswords;

}

class CreateALotOfPasswords:public cms::BaseChickenMushroomStewed
{

public:

    // 全字符表(字母 + 数字 + 所有标点符号)
    static const std::map<int,std::string> kaMapOfAlpNumAllPun;

    // 字母 + 数字 + 常用标点符号 -> 键值表
    static const std::array<int,72> kaArrOfAlpNumComPun_key;
    // 字母 + 数字 + 常用标点符号 -> 元素表
    static const std::array<char,72> kaArrOfAlpNumComPun_elem;

    // 字母 + 数字 + 部分标点符号 -> 键值表
    static const std::array<int,84> kaArrOfAlpNumSmallPun_key;
    // 字母 + 数字 + 部分标点符号 -> 元素表
    static const std::array<char,84> kaArrOfAlpNumSmallPun_elem;

    // 字母 + 数字 + 全部标点符号 -> 键值表
    static const std::array<int,92> kaArrOfAlpNumAllPun_key;
    // 字母 + 数字 + 全部标点符号 -> 元素表
    static const std::array<char,92> kaArrOfAlpNumAllPun_elem;

    // 字母表 -> 键值表
    static const std::array<int,52> kaArrOfAlphabet_Key;
    // 字母表 -> 元素表
    static const std::array<char,52> kaArrOfAlphabet_elem;

    // 数字列表 -> 键值表
    static const std::array<int,10> kaArrOfNumbers_Key;

    // 字母 + 数字 -> 键值表
    static const std::array<int,62> kaArrOfAlpNum_key;
    // 字母 + 数字 -> 元素表
    static const std::array<char,62> kaArrOfAlpNum_elem;

    // 十六进制数 -> 键值表
    static const std::array<int,16> kaArrOfHexadecimal;
    // 十六进制数 -> 键值表
    static const std::array<char,16> kaArrOfHexadecimal_elem;



public:
    explicit CreateALotOfPasswords();
    ~CreateALotOfPasswords();


    /*
     * @函数名称: 真随机数密码生产函数
     *
     * @参数说明:
     *     a: 密码长度参数，int 类型。
     *     b: 有5种值
     *         1 : 大小写字母 + 数字 + 常用标点符号
     *         2 : 大小写字母 + 数字 + 部分标点符号
     *         3 : 大小写字母 + 数字 + 全部标点符号
     *         4 : 大小写字母 + 数字  原生密码最大长度
     *         5 : 十六进制数
     *
     * @函数全名: functionStringOfProduceRandomNumberPasswords()
     * */
    std::string funStrOfProdRanNumPasswds(const int &a,const int &b) const;

    /*
     * @函数名称: 复合型密码生产函数
     *
     * @函数特点: 密码组成元素在原生密码长度范围内不重复。
     *
     * @参数说明：
     *     a: 密码长度参数，int 类型。
     *     b: 有4种值
     *         1 : 大小写字母 + 数字 + 常用标点符号 原生密码最大长度 72
     *         2 : 大小写字母 + 数字 + 部分标点符号 原生密码最大长度 84
     *         3 : 大小写字母 + 数字 + 全部标点符号 原生密码最大长度 92
     *         4 : 大小写字母 + 数字  原生密码最大长度 62
     * @函数全名: functionStringOfFreshPasswdCompoundComplex()
     */
    std::string funStrOfFreshPasswdCC(const int &a,const int &b) const;

    /*
     * 对象计数器取数函数
     * */
    static int sFunGetCounter();

    /*
     * 重载 new delete
     * */
    void *operator new(size_t s);
    void *operator new(size_t s,void *p);
    void operator delete(void *ptr);

private:
    //对象计数器
    static int sNewCounter;

    /*
     * 不同组合的密码生产函数
     *    字母 + 数字 + 常用标点符号: std::string funStrOfAlpNumComPun() const
     *    字母 + 数字 + 部分标点符号: std::string funStrOfAlpNumSmallPun() const
     *    字母 + 数字 + 全部标点符号: std::string funStrOfAlpNumAllPun() const
     *    字母表: std::string funStrOfAlphabet() const
     *    数字列表: std::string funStrOfNumbers() const
     *    字母 + 数字: std::string funStrOfAlpNum() const
     *    32位十六进制: std::string funStrOfHexadecimal32() const;
     *    64位十六进制: std::string funStrOfHexadecimal64() const;
     *    1* 16 至 256 * 16 位的十六进制: std::string funStrOfHexadecimalXX(const int k) const;
     */
    std::string funStrOfAlpNumComPun() const;
    std::string funStrOfAlpNumSmallPun() const;
    std::string funStrOfAlpNumAllPun() const;
    std::string funStrOfAlphabet() const;
    std::string funStrOfNumbers() const;
    std::string funStrOfAlpNum() const;
    std::string funStrOfHexadecimal32() const;
    std::string funStrOfHexadecimal64() const;
    std::string funStrOfHexadecimalXX(const int &k) const;

    /*
     * @函数名称: 随机生成字符的函数
     *
     * @函数返回值: 返回一个 char 类型字符
     *
     * @参数说明：
     *     b: 有5种值
     *         1 : 大小写字母 + 数字 + 常用标点符号
     *         2 : 大小写字母 + 数字 + 部分标点符号
     *         3 : 大小写字母 + 数字 + 全部标点符号
     *         4 : 大小写字母 + 数字
     *         5 : 十六进制数
     * @函数全名: functionStringOfProduceRandomChar()
     * */
    char funStrOfProdRanChar(const int &b) const;
};

#endif // CREATEALOTOFPASSWORDS_H
